package com.allwees.bs.c.module.address.controller;

import com.allwees.bs.c.module.address.def.CountryType;
import com.allwees.bs.c.module.address.def.LangType;
import com.allwees.bs.c.module.address.entity.RegionCountry;
import com.allwees.bs.c.module.address.service.IAddressService;
import com.allwees.bs.core.modelbase.vo.R;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api/address")
public class AddressController {
    @Autowired
    private IAddressService addressService;

    /**
     * 返回所有的国家详情
     *
     * @return 国家详情
     */
    @GetMapping("")
    public R getIndex() {
        return R.ok(addressService.getRegionCountries());
    }

    /**
     * 返回所有支持的国家信息
     *
     * @return 国家列表
     */
    @GetMapping("/country")
    public R getCountry() {
        @Getter
        @Setter
        @AllArgsConstructor
        class Country {
            /**
             * 国家类型
             */
            private CountryType countryType;
            /**
             * 名称
             */
            private String name;
        }

        List<Country> countries = new ArrayList<>();
        for (RegionCountry regionCountry : addressService.getRegionCountries()) {
            countries.add(new Country(regionCountry.getCountryType(), regionCountry.getCountryType().getName()));
        }

        return R.ok(countries);
    }

    /**
     * 返回指定的国家
     *
     * @return 国家
     */
    @GetMapping("/country/{countryType}")
    public R getCountry(@PathVariable("countryType") CountryType countryType) {
        return R.ok(addressService.getRegionCountry(countryType));
    }

    /**
     * 返回所有国家支持的语言
     *
     * @return 国家列表
     */
    @GetMapping("/country/{countryType}/lang")
    public R getCountryLang(@PathVariable("countryType") CountryType countryType) {
        @Getter
        @Setter
        @AllArgsConstructor
        class Lang {
            private LangType langType;
            private String name;
        }

        List<Lang> langs = new ArrayList<>();
        for (LangType langType : addressService.getLangTypes(countryType)) {
            langs.add(new Lang(langType, langType.getName()));
        }

        return R.ok(langs);
    }

    /**
     * 返回国家指定语言下的省市县
     *
     * @return 国家列表
     */
    @GetMapping("/country/{countryType}/lang/{langType}")
    public R getRegionLang(@PathVariable("countryType") CountryType countryType,
                           @PathVariable("langType") LangType langType) {
        return R.ok(addressService.getRegionLang(countryType, langType));
    }

    /**
     * 懒加载获取地埋信息
     *
     * @param countryType   国家类型
     * @param langType      语言类型
     * @param regionChildId 地埋位置 ID
     * @return 子地埋位置
     */
    @GetMapping("/country/{countryType}/lang/{langType}/regionChild/{regionChildId}")
    public R getRegionChild(@PathVariable("countryType") CountryType countryType,
                            @PathVariable("langType") LangType langType,
                            @PathVariable("regionChildId") String regionChildId) {
        return R.ok(addressService.getRegionChildById(countryType, langType, regionChildId));
    }
}
